// 需求：利用系统调用实现love.txt的一个备份love2.txt，并在控制台输出文件内容

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // 打开读文件, 得到对应的文件描述符
    int fd = open("love.txt", O_RDONLY); // 只读
    if (fd == -1)
    {
        perror("打开读文件失败");
        return -1;
    }
    // 打开写文件
    int fd2 = open("love2.txt", O_CREAT|O_WRONLY|O_APPEND, 0644); // 追加写，如果没有自动创建
    if (fd2 == -1)
    {
        perror("打开写文件失败");
        close(fd);
        // return -1;
        exit(EXIT_FAILURE); // 内部调用_exit
        // _exit(EXIT_FAILURE);
    }
    // 边读边写，同时输出
    char buf[100];
    ssize_t read_size;
    while((read_size = read(fd, buf, sizeof(buf))) > 0)
    {
        // 写入fd2
        write(fd2, buf, read_size);
        // 输出到控制台
        write(STDOUT_FILENO, buf, read_size);
    }
    
    if (read_size == -1)
    {
        perror("读取文件失败");
        // close(fd);
        // close(fd2);
        // return -1;

        // exit(EXIT_FAILURE);  // 内部会先关闭文件流再结束进程  前面不需要手动关闭文件流
        // 但在开发时，程序员一般也会手动关闭文件流，再调用exit

        close(fd);
        close(fd2);
        _exit(EXIT_FAILURE);  // 需要在前面手动关闭文件流
    }

    // 关闭读文件和写文件
    close(fd);
    close(fd2);

    printf("文件备份成功\n");

    return 0;
}
